package servicios;

import java.net.URI;
import java.util.Date;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import modelo.Factura;
import modelo.enums.Tarifa;
import persistencia.facturas.BDFactura;
import persistencia.facturas.BDFacturaImpl;

import com.sun.jersey.api.client.ClientResponse.Status;

@Path("facturas")
public class FacturaService
{

    public static final BDFactura datos = new BDFacturaImpl();

    @Context
    private UriInfo uriInfo;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response devuelveTodasFacturas(@DefaultValue("") @QueryParam("nif") String nif,
            @DefaultValue("-1") @QueryParam("metrosdesde") int desde,
            @DefaultValue("-1") @QueryParam("metroshasta") int hasta)
    {
        if (desde != -1 && hasta != -1 && nif.equals(""))
            return Response.ok(datos.getByMetros(desde, hasta)).build();
        else if (!nif.equals("") && desde != -1)
            return Response.ok(datos.getByMetrosYNIF(desde, hasta, nif)).build();
        else if (!nif.equals("") && desde == -1)
            return Response.ok(datos.findByNif(nif)).build();
        else
            return Response.ok(datos.getAll()).build();
    }

    @Path("{codigo}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response devuelveFacturaPorCodigo(@PathParam("codigo") int codigo)
    {
        Factura factura = datos.findByCode(codigo);
        if (factura == BDFacturaImpl.FACTURA_NULL)
            return Response.status(Status.NOT_FOUND).build();
        return Response.ok(factura).build();
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response anyadeFactura(@FormParam("codigo") int codigo, @FormParam("metros") int metros,
            @FormParam("tarifa") Tarifa tarifa, @FormParam("fecha") Date fecha,
            @FormParam("periodo") String periodo, @FormParam("cliente") String nif)
    {
        if (datos.findByCode(codigo) == BDFacturaImpl.FACTURA_NULL)
        {

            Factura factura = new Factura(codigo, metros, tarifa, fecha, periodo, nif);
            datos.insert(factura);

            UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
            URI uri = uriBuilder.path(Integer.toString(codigo)).build();
            return Response.created(uri).build();
        }
        else
        {
            return Response.status(Status.CONFLICT).build();
        }
    }

    @PUT
    @Path("{codigo}")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response actualizaFactura(@PathParam("codigo") int codigo, Factura factura)
    {
        if (codigo != factura.getCodigo())
        {
            return Response.status(Status.BAD_REQUEST).build();
        }
        else
        {
            Factura busqueda = datos.findByCode(codigo);
            if (busqueda == BDFacturaImpl.FACTURA_NULL)
            {
                return Response.status(Status.NOT_FOUND).build();
            }
            datos.update(factura);
        }
        return Response.status(Status.NO_CONTENT).build();
    }

    @Path("{codigo}")
    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    public Response borrarFactura(@PathParam("codigo") int codigo)
    {
        Factura factura = datos.findByCode(codigo);
        if (factura != BDFacturaImpl.FACTURA_NULL)
        {
            datos.delete(codigo);
            return Response.status(Status.OK).build();
        }

        return Response.status(Status.NOT_FOUND).build();
    }

}
